package test;

import org.junit.Test;

import java.util.Comparator;

public class 测试泛型 {
    /**
     * 泛型一般有三种使用方式：泛型接口、泛型类、泛型方法
     * 下面一一举例
     */
    @Test
    public void test() {
        //实例化泛型类
        GenericClass<Integer> integer = new GenericClass<>(1);

        //实例化泛型类——实现泛型接口
        GenericImpl2<String> stringGenericImpl2 = new GenericImpl2<>();
        System.out.print("泛型类（实现类型接口）：");
        System.out.println(stringGenericImpl2.method("你好哦~"));
        //实例化匿名内部类——实现泛型接口
        GenericInterface<Integer> genericInterface = new GenericInterface<Integer>() {
            @Override
            public Integer method(Integer o) {
                return o;
            }

            public void method2(Integer o) {
                System.out.println("你好。。。。");
            }
        };


        //lambda替代匿名内部类 （使用句柄表示类型）
        GenericInterface<Integer> genericInterface2 =
                o ->
                {
                    System.out.println("你好");
                    return o;
                };

        //使用泛型方法
        System.out.println(method(88));
        System.out.println(method(66));
    }

    /**
     * 泛型类
     */
    public class GenericClass<T> {// T表示一个确定的类型
        private T key;

        public GenericClass(T key) {
            this.key = key;
        }

        public T getKey() {
            return key;
        }
    }

    /**
     * 泛型接口
     */
    public interface GenericInterface<T> {
        T method(T t);
//        void method2(T t);
//        T method(T t1 ,T t2);
    }

    /**
     * 实现泛型接口
     */
    public class GenericImpl implements GenericInterface<Integer> {
        @Override
        public Integer method(Integer o) {
            return o;
        }

        //可以实现类可以拥有自己的方法
        public void test() {
        }

        ;
    }

    /**
     * 泛型类实现泛型接口
     */
    class GenericImpl2<T> implements GenericInterface<T> {

        @Override
        public T method(T t) {
            return t;
        }
    }

    /**
     * 泛型方法
     */
    public static <T> T method(T t) {
//        System.out.println(t.getClass());
        return t;
    }


}
